"""
针对users应用，定义的一些工具的模块
"""

from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from users.models import User
from meiduo_mall.utils.secret import SecretOauth
from django.conf import settings


# TODO: 多账号登陆方案二 ======自定义用户身份认证后端，实现多账号登陆验证=====
# 继承自 ModelBackend, 重写 authenticate 函数
class UsernameMobileAuthBackend(ModelBackend):
    """自定义用户认证后端"""

    def authenticate(self, request, username=None, password=None, **kwargs):
        """
        实现登陆验证 —— 验证用户名(账号)和密码
        :param request: 请求对象
        :param username: 账号，有可能是用户名，有可能是手机号，甚至有可能是邮箱
        :param password: 明文密码
        :return: 用户对象 或 None
        """
        try:
            user = User.objects.get(Q(username=username) | Q(mobile=username))
        except Exception as e:
            # 如果用户不存在，则返回None
            return None

        # 判断是否通过vue组件发送请求
        if request is None and not user.is_staff:
            return None

        # 如果密码正确, 则返回用户对象
        if user.check_password(password):
            return user


# 生成邮箱绑定激活链接
def generate_verify_email_url(request):
    # 1、用户信息
    data_dict = {"user_id": request.user.id, "email": request.user.email}
    # 2、将参数加密
    dumps_data = SecretOauth().dumps(data_dict)
    # 3、拼接完整的激活路由
    verify_url = settings.EMAIL_VERIFY_URL + dumps_data
    return verify_url


# 自定义JWT认证成功返回数据，添加username和user_id
def jwt_response_payload_handler(token, user=None, request=None):
    return {
        'token': token,
        'id': user.id,
        'username': user.username
    }
